<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script src="./js/index.js"></script>
  <script>
    // 构造函数
    function Person () {
      this.name = '张三';
      this.age = 20;
      this.run = function () {
        // alert('我是Person.constructor.run')
      }
    }
    let person = new Person
    // alert(person.name);
    Person.prototype.sex = '男'
    // 使用prototype定义的属性和方法，不能被继承冒充获取到（祥见下方Web）
    Person.prototype.runFuc = function () {
      // alert('我是Person.prototype.runFuc')
    }
    person.runFuc();
    console.log('sex');
    // 对象继承冒充
    function Web () {
      Person.call(this);
    }
    console.log('sumulate')
    // 实例化
    let w = new Web();
    w.run();

    // 原型链实现继承，既能继承构造器属性方法、又能继承原型链属性方法
    function WebPro () {

    }
    WebPro.prototype = new Person;
    let wp = new WebPro();
    wp.runFuc();

    // 原型链实现继承的问题
    // 1.实例化子类无法给父类传参
    function Parent (name, age) {
      this.name = name;
      this.age = age;
      this.run = function () {
        // alert(this.name + '在运动，年龄' + this.age);
      }
    }
    function SonWeb (name, age) {
      // 组合继承实现子类实例对象向父类构造函数传参[原型链+构造函数，祥见SonWeb函数内]
      Parent.call(this, name, age)
    }
    SonWeb.prototype = new Parent();
    let SonW = new SonWeb('张三', 20)
    SonW.run();

  </script>
</body>
</html>